/*
bfs可以搜到最短路,dfs不一定
*/
/*
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

输出：8
解释：
0代表可走，1代表障碍，求从左上角到右下角的最短路径
*/

#include <bits/stdc++.h>
using namespace std;

const int N=10010;
typedef pair<int,int> PII;

int n,m;
int g[N][N];//g数组存输入的地图
int d[N][N];//d数组存每个点到起点的距离
PII  q[N*N];

int bfs(){
  int hh=0,tt=0;
  q[0]={0,0};//将起点(0,0)入队
  memset(d,-1,sizeof d);//将所有点标记为-1

  d[0][0]=0;
  
  int dx[4]{-1,0,1,0},dy[4]={0,1,0,-1};

  while(hh<=tt){
    auto t=q[hh++];

    for(int i=0;i<4;i++){
      int x=t.first+dx[i],y=t.second+dy[i];

      if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&d[x][y]==-1){
        d[x][y]=d[t.first][t.second]+1;
        q[++tt]={x,y};
      }
    }
  }
  return d[n-1][m-1];

}

int main() {
  cin>>n>>m;

  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++)
      cin>>g[i][j];
  }

  cout<<bfs()<<endl;
  return 0;
}
